// 以下是es6之前版本的构造函数
// function Point(x, y) {
//   this.x = x;
//   this.y = y;
// }

// Point.prototype.getPostion = function() {
//   return '(' + this.x + ', ' + this.y + ')'
// }

// var p1 = new Point(2, 3)
// console.log(p1)
// console.log(p1.getPostion())
// var p2 = new Point(4, 5)
// console.log(p2.getPostion())

// class Point {
//   constructor (x, y) {
//     this.x = x;
//     this.y = y;
//   }

//   getPostion () {
//     return `(${this.x}, ${this.y})`
//   }
// }

// const p1 = new Point(1, 2)
// console.log(p1)
// console.log(p1.getPostion());
// console.log(p1.hasOwnProperty('x'));
// console.log(p1.hasOwnProperty('getPostion'));
// console.log(p1.__proto__.hasOwnProperty('getPostion'));

// var info = {
//   _age: 18,
//   set age(newValue) {
//     if (newValue > 18) {
//       console.log('怎么变老了');
//     } else {
//       console.log('哈哈，我还年轻')
//     }
//   },
//   get age() {
//     console.log('你问我年龄干嘛')
//     return this._age
//   }
// }

// console.log(info.age);
// info.age = 17
// info.age = 19

// class Info {
//   constructor (age) {
//     this._age = age
//   }
//   set age (newAge) {
//     console.log('new age is: ' + newAge)
//     this._age = newAge
//   }
//   get age () {
//     return this._age
//   }
// }

// const infos = new Info(18)
// infos.age = 17
// console.log(infos.age)

// 类的定义方式有两种
// 第一种
// class Infos {
//   constructor() {}
// }
// 第二种, 调用的时候用的是Infos， c可以去掉
// const Infos = class c {
//   constructor () {}
// }
// const Infos = class {
//   constructor () {}
// }

// class Point {
//   constructor (x, y) {
//     this.x = x;
//     this.y = y;
//   }

//   getPostion () {
//     return `(${this.x}, ${this.y})`
//   }

//   // 静态方法实例是继承不了的 p1.getClassName 会报错
//   static getClassName () {
//     return Point.name
//   }
// }

// const p1 = new Point(1, 2)
// console.log(p1.getPostion());
// console.log(Point.getClassName());

// class Point {
//   constructor () {
//     this.x = 0
//   }
// }
// Point.y = 2  // 设置类的静态属性
// const p = new Point()
// console.log(p.x);
// console.log(p.y);  // undefined

// const _func2 = () => {}

// class Point {
//   func1 () {
//     _func2.call(this)  // 调用私有方法
//   }
// }

// const p =  new Point()
// p._func2()  // 会直接报错

// const func1 = Symbol('func1') 可以通过symbol来设置

// new.target 

class Point {
  constructor() {
    console.log(new.target);  // 直接打印出这个class
  }
}

const p3 = new Point()

class Parent {
  constructor() {
    // console.log(new.target);  // 如果有子集继承父级，打印的是子集
    if(new.target === Parent) {
      throw new Error('不能实例化')
    }
  }
}

class Child extends Parent {
  constructor() {
    super()
  }
}

// const c = new Child()
const c = new Parent()  // 实例化父级直接报错






